package com.zhiyou.app.common.util;

import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class ObjSorterUtil {
    /**
     * 按指定顺序排序对象列表（通过Lambda表达式指定排序字段）
     *
     * @param objs           待排序的对象列表
     * @param codeOrder      指定的排序顺序参考列表
     * @param getterFunction Lambda表达式，用于提取对象中的排序字段
     * @param <T>            对象类型
     * @param <K>            排序字段类型
     * @return 按指定顺序排序后的对象列表
     */
    public static <T, K> List<T> sortByOrder(
            List<T> objs,
            List<K> codeOrder,
            Function<T, K> getterFunction) {

        // 创建排序字段到索引的映射，用于快速查找排序位置
        Map<K, Integer> orderIndexMap = new HashMap<>();
        for (int i = 0; i < codeOrder.size(); i++) {
            orderIndexMap.put(codeOrder.get(i), i);
        }

        return objs.stream()
                .sorted(Comparator.comparingInt(obj -> {
                    if (obj == null) {
                        return Integer.MAX_VALUE; // null对象放最后
                    }

                    // 通过getter方法获取字段值
                    K fieldValue = getterFunction.apply(obj);

                    // 不在指定顺序中的元素放最后
                    return orderIndexMap.getOrDefault(fieldValue, Integer.MAX_VALUE);
                }))
                .collect(Collectors.toList());
    }
}
